package com.loit.business.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.loit.business.entity.User;
import com.loit.business.dao.UserDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * @author :lifh
 * @date : 2022/12/20
 */
@Service
@Transactional(readOnly = true)
public class UserService {

    /**
     * 日志工具
     */
    public static Logger logger = LoggerFactory.getLogger(UserService.class);

    @Autowired
    private UserDao userDao;


    /**
     * 模拟复杂分页查询
     * @param page
     * @param age
     * @return
     */
    public IPage<User> selectUserByAge(Page<User> page, Integer age){
        return userDao.selectUserByGender(page,age);
    }


    public IPage<User> findListByPage(Page<User> page, User user){
        return userDao.findList(page,user);
    }

    /**
     * 简单分页查询:条件构造器QueryWrapper
     * @param page
     * @param queryWrapper
     * @return
     */
    public IPage<User> pageByAge(Page<User> page, QueryWrapper<User> queryWrapper){
        return userDao.selectPage(page,queryWrapper);
    }


    /**
     * 详情
     * @param id
     * @return
     */
    public User getById(int id){
        return userDao.selectById(id);
    }

    /**
     * 保存
     * @param user
     */
    public void insert(User user){
        userDao.insert(user);
    }


    /**
     * 不去捕捉异常，事务可直接生效
     */
    @Transactional(readOnly = false)
    public void transactions(){
        //1修改user随便一个值
        User user = new User();
        user.setAddress("中国");
        UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
        userUpdateWrapper.eq("age","3");
        userDao.update(user,userUpdateWrapper);
        System.out.println("修改user成功");
        //2制造异常，看有没有回滚
//        int a = 1/0;
//        System.out.println(a);
        User user2 = new User();
        user2.setUserName("中国啊啊啊啥啥啥酷酷酷11111");    //字段过长，会产生异常
        UpdateWrapper<User> userUpdateWrapper2 = new UpdateWrapper<>();
        userUpdateWrapper2.eq("id","6");
        userDao.update(user2,userUpdateWrapper2);
    }


    /*
     * 捕获异常时，要想使事务生效，需要在catch中手动抛出RuntimeException异常或者添加rollbackFor = Exception.class
     * 1.接口中A、B两个方法，A无@Transactional标签，B有，上层通过A间接调用B，此时事务不生效。
     * 2.接口中异常（运行时异常）被捕获而没有被抛出。
     */
    @Transactional
    public void transactions2(){
        try {
            //1修改user随便一个值
            User user = new User();
            user.setAddress("中国----");
            UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
            userUpdateWrapper.eq("age","3");
            userDao.update(user,userUpdateWrapper);
            System.out.println("修改user成功");
            //2制造异常，看有没有回滚
//        int a = 1/0;
//        System.out.println(a);
            User user2 = new User();
            user2.setUserName("中国啊啊啊啥啥啥酷酷酷11111---");    //字段过长，会产生异常
            UpdateWrapper<User> userUpdateWrapper2 = new UpdateWrapper<>();
            userUpdateWrapper2.eq("id","6");
            userDao.update(user2,userUpdateWrapper2);
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("捕捉到异常啦！！！，记得抛出异常或者rollbackFor = Exception.class哦，否则事务不生效。");
            throw new RuntimeException(e);
        }
    }


}
